#include <iostream>
using namespace std;

struct A
{
    int _a;

    A(int a)
        :_a(a)
    {
        cout << "A(int a)" << this << endl;
    }


    ~A()
    {
       cout << "~A()" << this << endl; 
    }
};
typedef int LNTDataType;
struct ListNode
{
public:
    ListNode(LNTDataType data = 0, int top = 4, int capacity = 4, ListNode* next = NULL)
    :_top(top),
    _capacity(capacity),
    _data(data)
    {
        _next = next;
    }
    
    void* operator new(size_t n) {
        cout << "operator new" << endl;
        void *obj = alloc.allocate(1);
        return obj;
    }
    void operator delete(void *ptr){
        cout << "operator delete" << endl;
        alloc.deallocate((ListNode *)ptr, 1);
    }
    

    void pushBack(LNTDataType data);    // 尾插
    void pushFront(LNTDataType data);   // 首插
    void print(void);                   // 打印
    void PopBack();                     // 尾删
    void PopFront();                    // 首删
    ListNode* FindData(LNTDataType data);   // 查找第一个data值的地址并返回
    void InsertFront(ListNode* pos, LNTDataType data);  // 在pos位置前插入data
    void InsertAfter(ListNode* pos, LNTDataType data);  // 在pos位置后插入data
    void EraseNode(ListNode* pos);      // 删除pos节点


private:
    int _top = 0;
    int _capacity;
    LNTDataType _data;
    ListNode* _next;
    static allocator<ListNode> alloc;
};
allocator<ListNode> ListNode::alloc;
/*
void ListNode::pushBack(LNTDataType data)    // 尾插
{
    if(top == _capacity) {
        int newcapacity = capacity * 2;
        ListNode* newHead = new ListNode(newcapacity);
        _capacity = newcapacity;
        this = newHead;
    }
}

void ListNode::pushFront(LNTDataType data);   // 首插
void ListNode::print(void);                   // 打印
void ListNode::PopBack();                     // 尾删
void ListNode::PopFront();                    // 首删
ListNode* ListNode::FindData(LNTDataType data);   // 查找第一个data值的地址并返回
void ListNode::InsertFront(ListNode* pos, LNTDataType data);  // 在pos位置前插入data
void ListNode::InsertAfter(ListNode* pos, LNTDataType data);  // 在pos位置后插入data
void ListNode::EraseNode(ListNode* pos);      // 删除pos节点
*/










void test1(void) {
    A* a1 = new A(12);
    A* a2 = new A[3] {{1}, {2}, {3}};
    delete a1;
    delete[] a2;
    
    ListNode* LN0 = new ListNode;
    ListNode* LN1 = new ListNode[3];

    LN1[0] = ListNode(1);
    LN1[1] = ListNode(2);
    LN1[2] = ListNode(3);
    delete LN0;
    delete[] LN1;

}
int main()
{
    //test1();
    char* p = new char[1024u * 1024u * 1024u * 2 - 1];// 32位机子堆区最大2^32 - 1
    cout << "创建成功\n";

    return 0;
}
